﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace EmployeeTask
{
    class Program
    {
        static void Main(string[] args)
        {
            Worker w1 = new Worker(100500, "Пётр");
            w1.CalculateSalary();
            HourlyWorker hw1 = new HourlyWorker(1.5, 168, "Хоря");
            hw1.CalculateSalary();
        }
    }

    abstract class Employee
    {
        public string name;
        public string Name
        {
            get { return name; }
            private set
            {
                if (!String.IsNullOrEmpty(value))
                {
                    name = value;
                }
                else
                {
                    Console.WriteLine("Ошибка. Поле имя не может быть пустым!");
                }
            }
        }

        public abstract void CalculateSalary();

        public Employee(string name)
        {
            this.name = name;
        }
    }

    class Worker : Employee
    {

        private decimal yearSalary;
        public decimal YearSalary
        {
            get
            {
                return yearSalary;
            }
            private set
            {
                if (value > 0)
                {
                    yearSalary = value;
                }
                else
                {
                    Console.WriteLine("Ошибка! Зарплата не может быть отрицательной!");
                    Console.WriteLine("Введите корректную зарплату:");
                    yearSalary = Decimal.Parse(Console.ReadLine());
                }
            }
        }

        public Worker (decimal yearSalary, string name) : base (name)
        {

            this.YearSalary = yearSalary;
        }

        public override void CalculateSalary()
        {
            Console.WriteLine("Сотрудник {0}. Месячный заработок - {1}", name, yearSalary/12);
        }

    }

    class HourlyWorker : Employee
    {
        private double hours;
        public double Hours
        {
            get
            {
                return hours;
            }
            private set
            {
                if (value > 0)
                {
                    hours = value;
                }
                else
                {
                    Console.WriteLine("Ошибка! Количество часов не может быть отрицательным!");
                    Console.WriteLine("Введите корректное колшичество часов:");
                    hours = Double.Parse(Console.ReadLine());
                }
            }
        }
        public double rate;
        public double Rate
        {
            get
            {
                return rate;
            }
            private set
            {
                if (value > 0)
                {
                    rate = value;
                }
                else
                {
                    Console.WriteLine("Ошибка! Рейт не может быть отрицательным!");
                    Console.WriteLine("Введите корректный рейт:");
                    rate = Double.Parse(Console.ReadLine());
                }
            }
        }

        public HourlyWorker (double rate, double hours, string name) : base (name)
        {
            this.Rate = rate;
            this.Hours = hours;
        }

        public override void CalculateSalary()
        {
            Console.WriteLine("Сотрудник {0}. Месячный заработок - {1}", name, hours*rate);
        }
    }
}
